package com.example.utils;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class IDCheck
{
	private static Map<Integer, String> map = new HashMap<Integer, String>();
	private static Pattern p = Pattern.compile("/^\\d{17}(\\d|x)$/i");
	static
	{
		map.put(11, "北京");
		map.put(12, "天津");
		map.put(13, "河北");
		map.put(14, "山西");
		map.put(15, "内蒙古");
		map.put(21, "辽宁");
		map.put(22, "吉林");
		map.put(23, "黑龙江");
		map.put(31, "上海");
		map.put(32, "江苏");
		map.put(33, "浙江");
		map.put(34, "安徽");
		map.put(35, "福建");
		map.put(36, "江西");
		map.put(37, "山东");
		map.put(41, "河南");
		map.put(42, "湖北");
		map.put(43, "湖南");
		map.put(44, "广东");
		map.put(45, "广西");
		map.put(46, "海南");
		map.put(50, "重庆");
		map.put(51, "四川");
		map.put(52, "贵州");
		map.put(53, "云南");
		map.put(54, "西藏");
		map.put(61, "陕西");
		map.put(62, "甘肃");
		map.put(63, "青海");
		map.put(64, "宁夏");
		map.put(65, "新疆");
		map.put(71, "台湾");
		map.put(81, "香港");
		map.put(82, "澳门");
		map.put(91, "国外");
		// .......
	}
	
	/**
	 * 检测身份证号是否为全数字
	 * 
	 * @param ID
	 * @return
	 */
	public static boolean checkIsNum(String ID)
	{
		if (ID == null)
		{
			return false;
		}
		if (ID.equals(""))
		{
			return false;
		}
		try
		{
			Long.parseLong(ID);
			return true;
		}
		catch (Exception e)
		{
			if (ID.endsWith("x") || ID.endsWith("X"))// 检测身份证尾数是否为字母X
			{
				return true;
			}
			else
			{
				return false;
			}
		}
	}
	public static boolean checkID(String ID)
	{
		int iSum = 0;
		if (p.matcher(ID) == null)
		{
			return false;
		}
		if (ID.length() != 18)// 检测身份证号码位数
		{
			return false;
		}
		if (!checkIsNum(ID))// 检测身份证号码是否为全数字
		{
			return false;
		}
		ID = p.compile("/x$/i").matcher(ID).replaceAll("a");
		Integer addr = Integer.parseInt(ID.substring(0, 2));
		if (!map.containsKey(addr))
			return false;
		String birthday = ID.substring(6, 10) + "/" + ID.substring(10, 12) + "/" + ID.substring(12, 14);
		Date d = new Date(birthday);
		int year = d.getYear() + 1900;
		String month = (d.getMonth() + 1) < 10 ? ("0" + (d.getMonth() + 1)) : (d.getMonth() + 1) + "";
		String day = (d.getDate() < 10 ? "0" + d.getDate() : d.getDate() + "");
		if (!birthday.equals(year + "/" + month + "/" + day))
		{
			System.out.println(year + "/" + month + "/" + day);
			return false;
		}
		// if (ID.contains("x") || ID.contains("X"))
		// {
		// for (int i = 16; i >= 0; i--)
		// {
		// iSum += (Math.pow(2, i) % 11) * Integer.parseInt(ID.charAt(16 - i) +
		// "");
		// }
		// }
		// else
		// {
		// for (int i = 17; i >= 0; i--)
		// {
		// iSum += (Math.pow(2, i) % 11) * Integer.parseInt(ID.charAt(17 - i) +
		// "");
		// }
		// }
		// if (!StringUtils.isNumeric(ID) && !ID.contains("x") &&
		// !ID.contains("X"))
		// {
		// return false;
		// }
		// if (iSum % 11 != 1)
		// {
		// return false;
		// }
		return true;
	}
	// public static boolean checkID(String ID)
	// {
	// if (ID == null)
	// {
	// return false;
	// }
	// if (ID.length() == 18)
	// {
	// return true;
	// }
	// return false;
	// }
}
